package com.hnust.controller;

import com.fasterxml.jackson.core.JsonParser;
import com.hnust.domain.Student;
import com.hnust.domain.accept.CourseAddResult;
import com.hnust.domain.record.CourseRecord;
import com.hnust.service.CourseService;
import com.hnust.service.TokenService;
import com.hnust.util.Result;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
 *创建人：彭鑫淼
 *创建时间：2020/10/5
 *描述：课程管理模块
 */
@CrossOrigin("*")
@RestController
@RequestMapping("/api/course")
public class CourseController {

    @Autowired
    CourseService courseService;

    @Autowired
    TokenService tokenService;

    /**
     * 获取所有课程信息
     * @param token token信息
     * @param collegeId 学院id
     * @param currentPage 当前第几页
     * @param rows 每页显示的数据量
     * @return
     */
    @GetMapping("/get")
    public Result<Map> getCourse(@RequestParam("token") String token, @RequestParam("collegeId") String collegeId, @RequestParam("currentPage")int currentPage, @RequestParam("rows") int rows){
        //验证token是否正确
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //获取课程列表信息，Map中包含List（数据信息）和count（数据条数）
        try{
            Map map=courseService.get(collegeId, currentPage, rows);
            return new Result<Map>(1,"课程获取成功",map);
        }catch (Exception e){
            return new Result<Map>(0,"课程获取失败",null);
        }

    }

    /**
     * 输入课程名搜索课程信息
     * @param map 前端返回的数据（token，collegeId,courseName,currentPage,rows）
     * @return
     */
    @PostMapping("/query")
    public Result<Map> query(@RequestBody Map<String,Object> map){
        String token=map.get("token").toString();
        String collegeId=map.get("collegeId").toString();
        String courseName=map.get("courseName").toString();
        Integer currentPage=Integer.valueOf(map.get("currentPage").toString());
        Integer rows=Integer.valueOf(map.get("rows").toString());
        //验证token是否正确
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //根据课程名获取相关课程列表，Map中包含List（数据信息）和count（数据条数）
        try {
            Map hashMap=courseService.query( collegeId, courseName, currentPage, rows);
            return new Result<Map>(1,"查询专业成功",hashMap);
        } catch (Exception e) {
            return new Result<Map>(0,"查询专业失败",null);
        }
    }

    /**
     * 添加课程
     * @param map 前端返回的数据（token，courseRecord）
     * @return
     */
    @PostMapping("/add")
    public Result<Map> add(@RequestBody Map<String,Object> map){
        //验证token是否正确
        String token=map.get("token").toString();
        JSONObject jsonObject=JSONObject.fromObject(map.get("courseRecord"));
        CourseRecord courseRecord=(CourseRecord) JSONObject.toBean(jsonObject, CourseRecord.class);
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //根据课程信息添加课程，返回结果为Boolean
        try {
            Boolean result=courseService.add(tokenService.getAdminAccount(token),courseRecord);
            return new Result<Map>(1,"添加课程成功",null);
        } catch (Exception e) {
            return new Result<Map>(0,"添加课程失败",null);
        }
    }

    /**
     * 删除课程
     * @param token token信息
     * @param courseId 要删除课程的Id
     * @return
     */
    @GetMapping("/delete")
    public Result<Map> deleteSingle(@RequestParam("token") String token,@RequestParam("courseId")String courseId){
       //验证token是否正确
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //根据课程Id，删除课程信息
        try {
            Boolean result=courseService.delete(courseId);
            return  new Result<Map>(1,"删除课程成功",null);
        } catch (Exception e) {
            return  new Result<Map>(0,"删除课程失败",null);
        }
    }

    /**
     * 批量删除课程
     * @param map 前端返回的数据（token，courseIds）
     * @return
     */
    @PostMapping("/delete")
    public Result<Map> deleteBatch(@RequestBody Map<String,Object> map){
        String token=map.get("token").toString();
        JSONArray courseIds= JSONArray.fromObject(map.get("courseIds"));
       //验证token是否正确
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //根据Id列表，删除相关课程
        try {
            Boolean result=courseService.delete(courseIds);
            return  new Result<Map>(1,"批量删除课程成功",null);
        } catch (Exception e) {
            return  new Result<Map>(0,"批量删除课程失败",null);
        }
    }

    /**
     * 修改课程信息
     * @param map 前端返回的数据（token，courseRecord）
     * @return
     */
    @PostMapping("/modify")
    public Result<Map> modify(@RequestBody Map<String,Object> map){
        String token=map.get("token").toString();
        JSONObject jsonObject=JSONObject.fromObject(map.get("courseRecord"));
        CourseRecord courseRecord=(CourseRecord) JSONObject.toBean(jsonObject, CourseRecord.class);
        //验证token是否正确
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //根据courseRecord中的课程信息，修改相关课程
        try {
            Boolean result=courseService.modify(courseRecord);
            return new Result<Map>(1,"修改课程成功",null);
        } catch (Exception e) {
            return new Result<Map>(0,"修改课程失败",null);
        }
    }

    //TODO 下载
    @GetMapping("/download")
    public void download(){

    }

    //TODO 上传
    @GetMapping("/upload")
    public Result<List<CourseRecord>> upload(@RequestParam("token")String token, @RequestParam("file")File file){
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<List<CourseRecord>>(0,"身份验证错误",null);
        }
        try {
            return new Result<List<CourseRecord>>(1,"读取数据成功",null);
        } catch (Exception e) {
            return new Result<List<CourseRecord>>(0,"读取数据失败",null);
        }
    }

    /**
     * 批量导入课程
     * @param map 前端返回的数据（token，courseRecords）
     * @return
     */
    @PostMapping("/course")
    public Result<Map> course(@RequestBody Map<String,Object> map){
        String token=map.get("token").toString();
        JSONArray jsonArray=JSONArray.fromObject(map.get("courseRecords"));
        List<CourseRecord> courseRecords = JSONArray.toList(jsonArray, new CourseRecord(), new JsonConfig());//参数1为要转换的JSONArray数据，参数2为要转换的目标数据，即List盛装的数据
        //验证token是否正确
        if(!tokenService.verifyToken(token, "院管理员")){
            return new Result<Map>(0,"身份验证错误",null);
        }
        //批量添加课程
        try {
            Boolean result=courseService.course(tokenService.getAdminAccount(token),courseRecords);
            return new Result<Map>(1,"添加课程成功",null);
        } catch (Exception e) {
            return new Result<Map>(0,"添加课程失败",null);
        }
    }
}
